RS-232/RS-485/RS-422 接口簡(jiǎn)介與編程
2007/9/11 10:01:00
一、什么是RS-232 接口? (1) RS-232 的歷史和作用 在串行通訊時(shí),要求通訊雙方都采用一個(gè)標(biāo)準(zhǔn)接口,使不同的設(shè)備可以方便地連接起來(lái)進(jìn)行通訊。RS-232-C接口(又稱(chēng)EIA RS-232-C)是目前最常用的一種串行通訊接口。(“RS-232-C”中的“-C”只不過(guò)表示RS-232的版本,所以與“RS-232”簡(jiǎn)稱(chēng)是一樣的)它是在1970 年由美國(guó)電子工業(yè)協(xié)會(huì)(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定的用于串行通訊的標(biāo)準(zhǔn)。它的全名是"數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)"該標(biāo)準(zhǔn)規(guī)定采用一個(gè)25 個(gè)腳的DB-25 連接器,對(duì)連接器的每個(gè)引腳的信號(hào)內(nèi)容加以規(guī)定,還對(duì)各種信號(hào)的電平加以規(guī)定。后來(lái)IBM的PC 機(jī)將RS-232 簡(jiǎn)化成了DB-9 連接器,從而成為事實(shí)標(biāo)準(zhǔn)。而工業(yè)控制的RS-232 口一般只使用RXD、TXD、GND 三條線。 (2)RS-232 接口的電氣特性 在RS-232-C 中任何一條信號(hào)線的電壓均為負(fù)邏輯關(guān)系。即:邏輯"1"為-3 到-15V;邏輯"0"為+3 到+15V 。RS-232-C 最常用的9 條引線的信號(hào)內(nèi)容如下所示 DB-9 1 2 3 4 5 6 7 8 9 DB-25 8 3 2 20 7 6 4 5 22 定義DCD RXD TXD DTR GND DSR RTS CTS RI (3) RS-232 接口的物理結(jié)構(gòu) RS-232-C 接口連接器一般使用型號(hào)為DB-9 插頭座,通常插頭在DCE端,插座在DTE端. PC 機(jī)的RS-232 口為9 芯針插座。而波士RS-232/RS-485轉(zhuǎn)換器的RS-232 為DB-9 孔插頭。一些設(shè)備與PC 機(jī)連接的RS-232 接口,因?yàn)椴皇褂脤?duì)方的傳送控制信號(hào),只需三條接口線,即"發(fā)送數(shù)據(jù)TXD"、"接收數(shù)據(jù)RXD"和"信號(hào)地GND"。RS-232 傳輸線采用屏蔽雙絞線。 (4)RS-232 傳輸電纜長(zhǎng)度 由RS -232C標(biāo)準(zhǔn)規(guī)定在碼元畸變小于4%的情況下,傳輸電纜長(zhǎng)度應(yīng)為50 英尺,其實(shí)這個(gè)4%的碼元畸變是很保守的,在實(shí)際應(yīng)用中,約有99%的用戶(hù)是按碼元畸變10-20%的范圍工作的,所以實(shí)際使用中最大距離會(huì)遠(yuǎn)超過(guò)50英尺,美國(guó)DEC公司曾規(guī)定允許碼元畸變?yōu)?0%而得出下面實(shí)驗(yàn)結(jié)果。其中1 號(hào)電纜為屏蔽電纜,型號(hào)為DECP.NO.9107723 內(nèi)有三對(duì)雙絞線,每對(duì)由22# AWG 組成,其外覆以屏蔽網(wǎng)。2 號(hào)電纜為不帶屏蔽的電纜。型號(hào)為DECP.NO.9105856-04是22#AWG 的四芯電纜。 DEC 公司的實(shí)驗(yàn)結(jié)果 波特率bps 1號(hào)電纜傳輸距離(米) 2號(hào)電纜傳輸距離(米) 110 1500 900 300 1500 900 1200 900 900 2400 300 150 4800 300 75 9600 75 75 經(jīng)過(guò)許多年來(lái)RS-232 器件以及通信技術(shù)的改進(jìn),RS-232 的通信距離已經(jīng)大大增加。波士電子的RS-232 增強(qiáng)器可以將普通的RS-232 口的通信距離直接延長(zhǎng)到1000米。 二、什么是RS-485 接口? 1. RS-485 的電氣特性: 發(fā)送端:邏輯"1"以?xún)删€間的電壓差為+(2 至6) V 表示;邏輯"0"以?xún)删€間的電壓差為-(2 至6)V 表示。接收端:A比B高200mV以上即認(rèn)為是邏輯"1",A 比B 低200mV 以上即認(rèn)為是邏輯"0"。 2. RS-485(或 RS-422)的接線: RS -485(或 RS-422)通信建議一定要接地,因?yàn)镽S-485(或 RS-422)通信要求通信雙方的地電位差小于1V。即:半雙工通信接3根線(+A、-B、地),全雙工通信接5根線(+發(fā)、-發(fā)、+收、-收、地)。為了安全起見(jiàn),建議通信機(jī)器的外殼接大地。RS-485(或 RS-422)光隔轉(zhuǎn)換器的所有外接電源的“地”必須全部連在一起但不要與計(jì)算機(jī)外殼地相連,因?yàn)殡娫础暗亍蓖瑫r(shí)也是RS-485或 RS-422的信號(hào)“地”。當(dāng)通信距離超過(guò)100米時(shí)建議最好使用光電隔離的通信接口轉(zhuǎn)換器。 3. RS-485 的數(shù)據(jù)最高傳輸速率為10Mbps。但是由于RS-485 常常要與PC 機(jī)的RS-232口通信,所以實(shí)際上一般最高115.2Kbps。又由于太高的速率會(huì)使RS-485 傳輸距離減小,所以往往為9600bps 左右或以下。 4. RS-485 接口是采用平衡驅(qū)動(dòng)器和差分接收器的組合,抗噪聲干擾性好。 5. RS-485接口的最大傳輸距離標(biāo)準(zhǔn)值為1200米(9600bps時(shí)),實(shí)際上可達(dá)3000米,RS-485 接口在總線上是允許連接多達(dá)128個(gè)收發(fā)器、即RS-485 具有多機(jī)通信能力,這樣用戶(hù)可以利用單一的RS-485 接口方便地建立起設(shè)備網(wǎng)絡(luò)。因RS-485 接口具有良好的抗噪聲干擾性,長(zhǎng)的傳輸距離和多站能力等上述優(yōu)點(diǎn)就使其成為首選的串行接口。因?yàn)镽S485 接口組成的半雙工網(wǎng)絡(luò),一般只需二根信號(hào)線,所以RS485 接口均采用屏蔽雙絞線傳輸。RS-485 的國(guó)際標(biāo)準(zhǔn)并沒(méi)有規(guī)定RS485 的接口連接器標(biāo)準(zhǔn)、所以采用接線端子或者DB-9、DB-25 等連接器都可以。波士RS-485 接口是事實(shí)工業(yè)標(biāo)準(zhǔn)。 6. 采用RS485 接口時(shí),傳輸電纜的長(zhǎng)度如何考慮? 在使用RS485 接口時(shí),對(duì)于特定的傳輸線經(jīng),從發(fā)生器到負(fù)載其數(shù)據(jù)信號(hào)傳輸所允許的最大電纜長(zhǎng)度是數(shù)據(jù)信號(hào)速率的函數(shù),這個(gè)長(zhǎng)度數(shù)據(jù)主要是受信號(hào)失真及噪聲等影響所限制。最大電纜長(zhǎng)度與信號(hào)速率的關(guān)系曲線是使用24AWG 銅芯雙絞電話電纜(線徑為0。51mm),線間旁路電容為52。5PF/M,終端負(fù)載電阻為100 歐時(shí)所得出。(引自GB11014-89附錄A)。當(dāng)數(shù)據(jù)信號(hào)速率降低到90Kbit/S 以下時(shí),假定最大允許的信號(hào)損失為6dBV 時(shí),則電纜長(zhǎng)度被限制在1200M。實(shí)際上,在實(shí)用時(shí)是完全可以取得比它大的電纜長(zhǎng)度。當(dāng)使用不同線徑的電纜。則取得的最大電纜長(zhǎng)度是不相同的。例如:當(dāng)數(shù)據(jù)信號(hào)速率為600Kbit/S 時(shí),采用24AWG 電纜,最大電纜長(zhǎng)度是200m,若采用19AWG 電纜(線徑為0.91mm)則電纜長(zhǎng)度將可以大于200m; 若采用28AWG 電纜(線徑為0.32mm)則電纜長(zhǎng)度只能小于200m。RS-485的遠(yuǎn)距離通信建議采用屏蔽電纜,并且將屏蔽層作為地線。 三、什么是RS-422 接口? RS-422 的電氣性能與RS-485完全一樣。主要的區(qū)別在于: RS-422 有4 根信號(hào)線:兩根發(fā)送(Y、Z)、兩根接收(A、B)。由于RS-422 的收與發(fā) 是分開(kāi)的所以可以同時(shí)收和發(fā)(全雙工)。RS-485 有2 根信號(hào)線:發(fā)送和接收都是A 和B。由于RS-485 的收與發(fā)是共用兩根線所以不能夠同時(shí)收和發(fā)(半雙工)。能否將RS-422 的Y-A 短接作為RS-485 的A、將RS-422 的Z-B 短接作為RS-485 的B呢?回答:不一定。條件是RS-422 必須是能夠支持多機(jī)通信的。波士電子的所有接口轉(zhuǎn)換器的RS-422 口都能夠支持全雙工多機(jī)通信,所以可以這樣簡(jiǎn)單轉(zhuǎn)換為RS-485。 四、RS-485 比RS-232接口相比有何特點(diǎn)? 由于RS-232 接口標(biāo)準(zhǔn)出現(xiàn)較早,難免有不足之處,主要有以下四點(diǎn): (1) 接口的信號(hào)電平值較高,易損壞接口電路的芯片,又因?yàn)榕cTTL 電平不兼容故需使用電平轉(zhuǎn)換電路方能與TTL 電路連接。 (2) 傳輸速率較低,在異步傳輸時(shí),波特率為20Kbps?,F(xiàn)在由于采用新的UART 芯片16C550 等,波特率達(dá)到115.2Kbps。 (3) 接口使用一根信號(hào)線和一根信號(hào)返回線而構(gòu)成共地的傳輸形式, 這種共地傳輸容 易產(chǎn)生共模干擾,所以抗噪聲干擾性弱。 (4) 傳輸距離有限,最大傳輸距離標(biāo)準(zhǔn)值為50 米,實(shí)際上也只能用在15米左右。 (5)RS-232 只允許一對(duì)一通信,而RS-485 接口在總線上是允許連接多達(dá)128個(gè)收發(fā)器。 五、串口通信功能的實(shí)現(xiàn) 利用VC++實(shí)現(xiàn)串口通信的方法有多種,我們采取直接調(diào)用Window API中的一系列標(biāo)準(zhǔn)的串口通信函數(shù),直接用這些標(biāo)準(zhǔn)函數(shù)來(lái)完成Windows下面的串口通信編程[11]。利用WindowsAPI函數(shù)控制利用API 函數(shù)實(shí)現(xiàn)對(duì)RS232串口通信的訪問(wèn),在實(shí)現(xiàn)控制通信中,我們必定要調(diào)動(dòng)3個(gè)函數(shù)來(lái)實(shí)現(xiàn)對(duì)串口的控制: CreatFile()函數(shù)實(shí)現(xiàn)串口初始化并打開(kāi)串口; ReadFile()函數(shù)接收串口傳遞過(guò)來(lái)的二進(jìn)制流并返回?cái)?shù)據(jù)到接收緩沖區(qū)中 WriteFile()把應(yīng)用程序發(fā)出的指令送到發(fā)送緩沖區(qū)以供串口接收1. 打開(kāi)串口 以下程序用于以同步方式打開(kāi)串口COM1; HANDLE hCom; DWORD dwErrorHcomm=CreateFile(“COM1”,GENERIC_READ|GENERIC_WRITE ,0, NULL,OPEN_EXISTING, 0, NULL); if (hComm==(HANDLE)0Xffff) { dwError=GetLastError(); MessageBox(dwError); } 2. 配置串口 配置串口是通過(guò)改變?cè)O(shè)備控制塊DCB(Device Control Block)的成員變量值來(lái)實(shí)現(xiàn)的,程序?qū)崿F(xiàn)如下: DCB dcb dcb.BaudRate=9600;//波特率為9600bps dcb.ByteSize=8;//數(shù)據(jù)位8位 dcb.Parity=EVENPARTTY;//有校驗(yàn) dcb.StopBits=ONESTOPRTT; //一個(gè)停止位 SetCommState(hCom,&dcb); 3. 數(shù)據(jù)讀寫(xiě) 對(duì)串口進(jìn)行讀寫(xiě)與對(duì)文件進(jìn)行讀寫(xiě)所用的函數(shù)相同,具體為可采用查詢(xún)、同步、異步或事件驅(qū)動(dòng)等方法對(duì)串口進(jìn)行讀寫(xiě)所用函數(shù)如下所示: bReadStatus=ReadFile(hCom,buffer,length,&length &m_lpOverlapped); if(!bReadStatus) { if(GetLastError()=ERROR_IO_PENDING) { WaitForSingleObject(m_lpOverlapped,hEvent,1000); return((char)length); } return 0; } //寫(xiě)入函數(shù)程序?yàn)? bWriteStatus=WriteFile(hCom,buffer,length,&length,&m_lpOverlapped) if(!bWriteStatus) { if(GetLastError()=ERROR_IO_PENDING) { WaitForSingleObject(m_lpOverlapped, hEvent,1000); return((char)length); } return 0; } 4. 程序的編制 用VC++進(jìn)行程序的編制首先要對(duì)串口進(jìn)行初始化,設(shè)定端口,通信速率和校驗(yàn)方<
提交
查看更多評(píng)論
其他資訊
紫金橋跨平臺(tái)實(shí)時(shí)數(shù)據(jù)庫(kù)發(fā)布會(huì)及入門(mén)培訓(xùn)視頻回放
紫金橋跨平臺(tái)實(shí)時(shí)數(shù)據(jù)庫(kù)入門(mén)培訓(xùn)即將開(kāi)始啦
紫金橋跨平臺(tái)實(shí)時(shí)數(shù)據(jù)庫(kù)RealHistorian
紫金橋跨平臺(tái)實(shí)時(shí)數(shù)據(jù)庫(kù)新品發(fā)布會(huì)
跨平臺(tái)實(shí)時(shí)數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)表格的保存和讀取